class PersonasController < ApplicationController

  before_filter :login_required
  require_role 'admin', :only=>[:new, :edit, :update, :destroy]
  
  # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
  verify :method => :post, :only => [ :destroy, :create, :update ],
         :redirect_to => { :action => :list }

  def index
    store_location
    list
    render :action => 'list'
  end

  # listados de mails
  def mails
    store_location
    # FIXME sin nadie tiene email esto da error por evaluar nil
    @mails = Persona.find(:all, :conditions => "mail <> ''").collect{|p| p.mail}
    @mails = (@mails and @mails.size>0)? @mails.join('; ') : ''
  end

  def list
    # TODO opciones de orden
    store_location
    paginar_personas(1)
  end

  def general_search
    @page_title = 'B&uacute;squeda'
    store_location
    return unless params[:persona]
    return if params[:persona].strip == ''
    tokens = params[:persona].strip.split(' ',2)
    query = "nombres like ? OR apellidos like ? OR (nombres like ? and apellidos like ?) OR (apellidos like ? and nombres like ?)"
    @personas = Persona.find(:all, :conditions=>[query,"#{params[:persona]}%","#{params[:persona]}%",
                                                  "#{tokens[0]}%","#{tokens[1]}%","#{tokens[0]}%","#{tokens[1]}%"])
    @string = params[:persona].strip
  end

  def live_search
    paginar_personas(1)
    render :partial=>'hits', :locals=>{:nombres=>params[:nombres],:apellidos=>params[:apellidos],:mail=>params[:mail], :profesion=>params[:profesion]}
  end

  # redirije al show del controlador correspondiente
  def pre_show
    redirect_to_show(Persona.find(params[:id]))
  end
  
  def pre_edit
    redirect_to_edit(Persona.find(params[:id]))
  end

  def show
    store_location
    @persona = Persona.find(params[:id])
  end

  def new
    @persona = Persona.new
  end

  def create
    @persona = Persona.new(params[:persona])
    @persona.tag_list = params[:tags]
    if @persona.save
      flash[:success] = 'Se agreg&oacute; la persona con &eacute;xito.'
      redirect_to :action => 'new'
    else
      render :action => 'new'
    end
  end
  
  def edit
    @persona = Persona.find(params[:id])
  end

  def del_image
    p = Persona.find(params[:id])
    raise ActiveRecord::RecordNotFound, 'Persona no encontrada' if p.nil?
    raise ActiveRecord::RecordInvalid, 'Datos invalidos en esta persona' unless p.valid?

    file_path = p.foto
    
    if File.exist?(file_path) then
      p.foto = nil
      if p.save! then 
        if File.delete(file_path) then
          flash[:success] = "Foto eliminada"
        else # no se pudo eliminar el archivo, rollback BD.
          K_LOGGER.error "#{current_user.login}: personas/del_image: #{file_path} existe pero no se puede eliminar."
          flash[:error] = "Foto encontrada, pero error al intentar eliminarla."
          p.foto = file_path
          p.save!
        end
      else # no se pudo modificar la BD.
        flash[:error] = "No se pudo eliminar la foto."
        K_LOGGER.error = "No se pudo setear en nil p.foto de p.id:#{p.id}"
      end
    else # no encontro el archivo, seteo en nil la BD
      p.foto = nil;
    	p.save!
      K_LOGGER.warning = "#{current_user.login}: personas/del_image: Intenta eliminar #{file_path}, pero no existe."
      flash[:notice] = "El archivo no exist&iacute;a."
    end
    redirect_to_edit(p)
    
  rescue ActiveRecord::RecordInvalid => e
    flash[:error] = "Esta persona tiene datos invalidos, modifiquelos antes de eliminar la foto.<br/> #{e.message}"
    redirect_to_edit(p)
  rescue ActiveRecord::RecordNotFound
    flash[:error] = "Persona no encontrada."
    K_LOGGER.error "#{current_user.login}: personas/del_image: Llega a del_image con id de persona desconocido."    
    redirect_back_or_default :controller=>'main'
  rescue Errno::ENOENT
    flash[:error] = "Foto no encontrada."
    redirect_back_or_default :controller=>'personas', :action=>'pre_show', :id=>p
  end

  def update
    @persona = Persona.find(params[:id])
    @persona.tag_list.add(params[:tags], :parse=>true)
    if @persona.update_attributes(params[:persona])
      flash[:success] = 'Datos actualizados exitosamente.'
      redirect_back_or_default :action => 'show', :id => @persona
    else
      render :action => 'edit'
    end
  end

  def destroy
    p = Persona.find(params[:id])
    tag_list = p.tag_list
    tag_list.each do |t|
      p.tag_list.remove(t)
      p.save
    end
    p.destroy
    redirect_back_or_default :action => 'list'
  end
end
